---
title: 设计模式
sidebar_position: 3
---

设计模式是个老生常谈的话题, 不同的人对此有不同的看法

* 新手可能会觉得设计模式难以理解, 并且也只与编程语言有关, 或者只与前端后端有关, 适用范围很窄  
    或者就干脆觉得这玩意儿没啥卵用, 写了那么一大坨只是让代码变得复杂难懂, 不如直接复制黏贴删删改改来得方便
* 老手可能会觉得设计模式就是yyds, 写代码时不搞个什么模式就显得太low了   
    不管写什么东西都要分离出接口和实现, 搞一个战未来的模式, 不如此无法体现出设计模式的"灵活性"
* 也有人根本没听说过什么设计模式, 但看了些例子之后表示, "就这?"
* ......

## 什么是设计模式

设计模式(Design pattern)并不是什么创新性的发明, 只是对一些解决方案的归纳    
就像在 "氧气" 这个词出现之前, 人类也是一样可以呼吸的    
针对不同场景下的问题, 开发人员使用了不同的解决方案, 经过整理归纳之后形成了针对特定场景的通用方案, 这些方案被称为"设计模式"

## 设计模式六大原则

* 总则: 开放封闭原则(Open Closed Principle,OCP): 对扩展开放, 对修改关闭。即在不修改原有代码的基础上进行扩展
* 单一职责原则(Single Responsibility Principle,SRP): 一个类或者一个方法只有一个职责
* 里氏替换原则(Liskov Substitution Principle,LSP): 子类可以替换父类, 并保持父类的功能和特性
* 依赖倒置原则(Dependency Inversion Principle,DIP): 高层模块不应该依赖于低层模块, 二者都应该依赖于抽象, 而不是具体的实现细节
* 接口隔离原则(Interface Segregation Principle,ISP): 尽量使用多个专门的接口, 而不是单一的总接口
* 最少知道原则(Law of Demeter,LoD): 一个对象应该对其他对象有尽可能少的了解, 不应该直接与其他对象之间发生联系
* 合成复用原则(Composite/Aggregate Reuse Principle,CARP): 尽量使用合成, 而不是通过继承达到复用的目的

~~众所周知四大天王有五个, 所以六大原则有七个也是很正常的事情~~

## 三大类设计模式

* 创建型模式: 关注对象的创建过程, 包括对象的实例化和组装方式, 使得代码更加灵活可扩展
* 结构型模式: 关注对象之间的组成和协作方式, 帮助我们将对象组合成更大的结构, 以实现更复杂的功能
* 行为型模式: 关注对象之间的交互方式和职责划分, 使得系统中对象之间的通信更加灵活高效

## 二十三种设计模式

* 创建型模式
    * 工厂方法模式(Factory Method Pattern)
    * 抽象工厂模式(Abstract Factory Pattern)
    * 单例模式(Singleton Pattern)
    * 建造者模式(Builder Pattern)
    * 原型模式(Prototype Pattern)
* 结构型模式
    * 适配器模式(Adapter Pattern)
    * 桥接模式(Bridge Pattern)
    * 组合模式(Composite Pattern)
    * 装饰模式(Decorator Pattern)
    * 外观模式(Facade Pattern)
    * 享元模式(Flyweight Pattern)
    * 代理模式(Proxy Pattern)
* 行为型模式
    * 责任链模式(Chain of Responsibility Pattern)
    * 命令模式(Command Pattern)
    * 解释器模式(Interpreter Pattern)
    * 迭代器模式(Iterator Pattern)
    * 中介者模式(Mediator Pattern)
    * 备忘录模式(Memento Pattern)
    * 观察者模式(Observer Pattern)
    * 状态模式(State Pattern)
    * 策略模式(Strategy Pattern)
    * 模板方法模式(Template Method Pattern)
    * 访问者模式(Visitor Pattern)


